module.exports = options => {
    const AdminUser = require('../models/AdminUser')
    const jwt = require('jsonwebtoken')
    const assert = require('http-assert') //http-assert(用于测试函数、值是否存在、是否正确的工具包)

    // 1.token验证:只需要在所有后端接口中添加一个验证是否存在token的中间件即可，接口的访问过程是调用→运行→返回数据。
    // 2.所以我们在接口调用之后、运行之前的位置加一个验证token的函数作为接口的中间件
    // 从而验证到非登录人员，将其页面跳转到登陆页面即可。
    // 3.由于根据代码规范传入的token值带有Bearer和空格,所以用split方法找到空格,在空格处分离Bearer和token值形成数组
    // 4.再使用pop方法提取数组中最后一个值(也就是token值)
    return async (req, res, next) => {
        const token = String(req.headers.authorization || '').split(' ').pop()
        assert(token, 401, '请先登录')
        // console.log(token); 
        // 使用jwt提取token数据(解密),当时我们传入的是用户id,所以解密出的就是用户id和一个自带参数
        const { id } = jwt.verify(token, req.app.get('secret'))//verify为解密方法
        assert(id, 401, '请先登录')
        req.user = await AdminUser.findById(id)
        assert(req.user, 401, '请先登录')
        // console.log(req.user);
        await next()
    }
}